from employee import Employee
import os


class EmployeeManagerSystem(object):
    employee_data_file = 'employee.data'  # 类属性，不经常改变
    # 上次保存前的员工信息备份文件，而且只备份一份
    employee_data_file_backup = 'employee.data.backup'  # 类属性，不经常改变

    def __init__(self):
        self.employee_list = []  # 从文件中加载之后的员工列表  对象属性，后续会经常改变
        self.save_flag = True  # 已经保存员工数据了

    def main(self):
        """
        程序的执行入口  员工管理系统的入口
        :return:
        """
        # 1.加载和读取员工数据文件
        self.load_employee()
        while True:
            # 2.显示系统欢迎界面
            self.show_hello()
            # 3.由用户输入指定的功能数字
            menu_number = int(input('请输入你需要的功能编号：'))
            if menu_number == 7:
                self.go_out()
                break
            elif menu_number == 1:
                self.add_employee()
            elif menu_number == 2:
                self.del_employee()
            elif menu_number == 3:
                self.update_employee()
            elif menu_number == 4:
                self.search_employee()
            elif menu_number == 5:
                self.show_all_employee()
            elif menu_number == 6:
                self.save_employee()

    def go_out(self):
        """
        退出程序的需求：如果员工进行了添加、修改、删除，那么必须要保存到文件中
        1.如果没有保存，则在退出之前要自动报讯
        2.怎么确定有没有保存
        :return:
        """
        if  not self.save_flag:  # 表示员工数据修改后 还没有保存
            self.save_employee()
        print('谢谢访问！程序退出')

    def save_employee(self):
        """
        保存的需求和步骤：
        1.先把原来的数据文件备份（如果已经存在备份文件，则把备份文件删除）
        2.创建新文件
        3.写入数据
        4.关闭文件流
        :return:
        """
        if os.path.exists(self.employee_data_file_backup):
            os.remove(self.employee_data_file_backup)  # 删除备份文件
        # 1.备份   修改文件名
        os.rename(self.employee_data_file, self.employee_data_file_backup)
        # 2.打开文件流
        with open(self.employee_data_file, 'w', encoding='gbk') as f:
            # 3.写入数据
            new_list = []
            for emp in self.employee_list:  # 原来的列表中是一个个的员工Employee对象，
                new_list.append(emp.__dict__)  # emp.__dict__ 将emp 对象转化为字典  new_list: [{},{},{}]
            f.write(str(new_list))  # 将列表转为字符串 写入文件
            self.save_flag = True  # 完成了一次保存
            print('修改已保存')

    def show_all_employee(self):
        """展示所有的员工信息"""
        print('姓名\t年龄\t性别\t手机号码\t是否离职')
        for emp in self.employee_list:
            print(emp)

    def search_employee(self):
        """
        根据姓名查找员工信息
        :return:
        """
        # 1.输入需要修改的员工的名字
        search_name = input('请输入要查询的员工姓名：')

        # 2.遍历员工列表，判断是否存在，存在则返回员工信息
        for emp in self.employee_list:
            if emp.name == search_name:
                print(emp)
                break
        else:
            print(f'没有找到名字为{search_name}的员工')

    def update_employee(self):
        """
        修改员工：首先要输入需要修改的员工的名字，然后在依次修改该员工的属性
        :return:
        """
        # 1.输入需要修改的员工的名字
        update_name = input('请输入要修改的员工姓名：')

        # 2.遍历员工列表，判断是否存在，存在则修改
        for emp in self.employee_list:
            if emp.name == update_name:  # 员工存在
                self.save_flag = False  # 完成了一次修改，暂时没有保存
                # 3.修改员工其他属性
                new_name = input('请输入员工新的姓名(不修改直接回车)').strip()
                emp.name = new_name if new_name else emp.name

                new_gender = input('请输入员工新的性别(不修改直接回车)').strip()
                emp.gender = new_gender if new_gender else emp.gender

                new_age = input('请输入员工新的年龄(不修改直接回车)').strip()
                emp.age = int(new_age) if new_age else emp.age

                new_mobile_number = input('请输入员工新的手机号(不修改直接回车)').strip()
                emp.mobile_number = new_mobile_number if new_mobile_number else emp.mobile_number

                new_is_leave = input('请输入员工新的离职情况,1表示离职，0表示在职(不修改直接回车)').strip()
                if new_is_leave:
                    emp.is_leave = True if int(new_is_leave) == 1 else False

                print('员工的信息已经修改完成：')
                print(emp)
                break
        else:  # 表示循环正常结束，没有找到员工
            print(f'没有找到名字叫{update_name}的员工')

    def del_employee(self):
        """
        删除员工的需求：输入一个被删除的员工名字
        :return:
        """
        # 1.输入被删除的员工的名字
        del_name = input('请输入要删除的员工姓名：')
        # 2.遍历员工列表，判断员工是否存在，存在就删除
        for emp in self.employee_list:
            if emp.name == del_name:
                self.save_flag = False  # 完成了一次修改，暂时没有保存
                self.employee_list.remove(emp)
                print(f'名字为{del_name}的员工已经被删除')
                break
        else:  # 没有找到员工信息
            print(f'没有找到名字为{del_name}的员工')

    def add_employee(self):
        """
        添加员工信息
        :return:
        """
        # 1.由用户输入需要的添加的员工信息
        name = input('请输入员工的姓名：')
        gender = input('请输入员工的性别：')
        age = int(input('请输入员工的年龄：'))
        mobile_number = input('请输入员工的手机号：')
        is_leave = int(input('请输入员工是否离职,1表示离职，0表示在职：'))
        # 2.创建员工对象
        emp = Employee(name, gender, age, mobile_number, is_leave)
        self.save_flag = False  # 完成了一次修改，暂时没有保存
        # 3.把新添加的员工添加到员工列表中
        self.employee_list.append(emp)
        # 4.把刚刚添加的员工信息进行输出
        print(emp)

    @staticmethod
    def show_hello():  # 即没有用到self,也不要用到当前的类，可以定义为静态函数  @staticmethod
        print('欢迎进入企业员工管理系统')
        print('-' * 60)
        print('1:添加员工')
        print('2:删除员工')
        print('3:修改员工')
        print('4:查找员工')
        print('5:展示所有员工')
        print('6:保存员工')
        print('7:退出系统')
        print('-' * 60)

    def load_employee(self):
        """
        读取员工数据文件，把所有的员工信息都放在一个列表中 employee_list
        :return:
        """
        try:
            f = open(self.employee_data_file, 'r', encoding='gbk')
        except Exception as err:
            # 如果报错，很有可能第一次启动程序，这个文件还不存在，需要先创建文件
            f = open(self.employee_data_file, 'w', encoding='gbk')
        else:  # 没有报错，意味着文件存在
            # 读取文件中的数据
            data = f.read()
            if data:  # 如果文件内不为空
                lst = eval(data)  # 把 data文件内容（字符串）当成 python 表达式‘[{},{},{}]’ 进行解析，转成 列表
                for dict1 in lst:
                    self.employee_list.append(  # 员工列表中放入 员工Employee对象
                        Employee(dict1['name'], dict1['gender'], dict1['age'], dict1['mobile_number'],
                                 dict1['is_leave']))
        finally:
            if f:
                f.close()


if __name__ == '__main__':
    s = EmployeeManagerSystem()
    s.main()
